home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 11, No. 08 (1990-08)(MindCraft Publishing)(Side A)[a].zip
/
Nibble Volume 11, No. 08 (1990-08)(MindCraft Publishing)(Side A)[a].po
/
SAVER.ASM.txt
< prev
next >
Wrap
Text File
|
1996-12-24
|
11KB
|
573 lines
**********************************
* *
* SAVER.ASM Source Code *
* by Thomas Dorris *
* *
* Copyright (c) 1990 *
* MindCraft Publ. Corp. *
* Concord, MA 01742 *
* Orca/M Assembler *
**********************************
MCOPY SAVER.MAC
KEEP SAVER
*
* Global equates
*
keep 'rampatch'
org $9c00
COL80CLR GEQU $E1C00C ;Sets 40 column mode
OS_ID GEQU $E100BC ;1 for ProDOS 16
SCREEN GEQU $E12000 ;Super Hires screen
BANK0 GEQU $000C00 ;Start Bank0 program
MAIN START
*
* Initial data for a Classic Desk Accessory
*
STR 'Screen Saver' ;Title of CDA
DC I4'SSSTART' ;starting code
DC I4'SSEND' ;shutdown code
*
*
* Main code block
*
*
SSSTART PHK
PLB ;Set data bank
SEP #$20
STA COL80CLR
REP #$30
LDA #TITLE
JSR DISPLAY ;Clear screen
JSR GETLINE ;Input name of file
AND #$00FF ;Acc contains length
BEQ SSEND ;If length=0, exit
LDA #$A3 ;Display screen
STA $E1C029
JSR CHCKID
BEQ PRO16
JSR DOPRO8
BNE ERROR
BRA CLS2
PRO16 DESTROY CREATEPARM ;Close and delete file
BCC CRT
CMP #$46
BNE ERROR
CRT CREATE CREATEPARM ;Create new file
BCS ERROR
OPEN OPENPARM
BCS ERROR
LDA OPENPARM ;Save reference number
STA WRITEPARM
WRITE WRITEPARM ;Write screen data to disk
BCS ERROR
CLS CLOSE OPENPARM ;Close and return
CLS2 JSR DSPOFF
SSEND RTL
*
*
* Error code. Displays error message and exits
*
*
ERROR PHA
JSR DSPOFF ;Set text mode
LDA #ERRMSG
JSR DISPLAY ;print error message
PLA
SEP #$20
LONGA OFF
PHA
AND #$F
TAX
LDA LST,X
ORA #$80
STA $E0053A
PLA
LSR A
LSR A
LSR A
LSR A
TAX
LDA LST,X
ORA #$80
STA $E00539
REP #$30
LONGA ON
WT LDA $E1BFFF ;Get key
BPL WT
STA $E1C010
JSR CHCKID
BNE CLS2
BRA CLS ;Close if opened and exit
LST ASC '0123456789ABCDEF'
DSPOFF LDA #$1 ;Go to text mode
STA $E1C029
RTS
CHCKID LDA OS_ID
AND #$00FF
CMP #$1
RTS
*
*
* Clears screen and displays message block
*
*
DISPLAY LDX #$3FE
STA LOADADR+1
STA LDADR1+1
LDA #$A0A0
CLEAR STA $E00400,X ;Store space
DEX
DEX
BPL CLEAR
LDY #$FFFE
INCRY INY
INY
LOADADR LDX TITLE,Y ;Get screen address
BEQ DISPDONE ;If zero, end of data
INCRX INY
INY
LDADR1 LDA TITLE,Y ;Get character
BEQ INCRY ;If zero, get next line
ORA #$8080
STA $E00400,X
INX
INX
BRA INCRX
DISPDONE RTS
*
*
* Input line. Ignores all but alphanumeric keys
*
*
GETLINE LDA #NAME-STRT8+START8 ;location of P8 path
STA ZPG2+1
INC A
STA ZPG1+1
SEP #$20 ;8-bit accumulator mode
LONGA OFF
GETKEY1 LDX #0
GETKEY LDA #$2E
STA $E00528,X
JSR WAIT ;Get key and mask
AND #$7F
CMP #$60 ;Convert to upper case
BCC UPPER
EOR #$20
UPPER CMP #$8
BNE NTBKSP
BKSP LDA #$AE ;delete cursor
STA $E00528,X
DEX ;Decrease counter
BPL GETKEY
BMI GETKEY1
NTBKSP CMP #$5F ;If delete, do backspace
BEQ BKSP
CMP #$20 ;If SPACE,screen display
BEQ SCNDIS
CMP #$1B ;If ESC, exit
BEQ ESC
CMP #$0D ;If return, done
BEQ KEYDONE
CMP #$2E
BCC GETKEY ;Check for period and slash
CMP #$3A
BCC KEYOK
CMP #$41 ;Check for alpha-keys
BCC GETKEY
CMP #$5B
BCS GETKEY
KEYOK STA BUF+1,X ;Store key in buffer (P16)
ZPG1 STA NAME+1,X ;Store key in buffer (P8)
ORA #$80
STA $E00528,X ;Display on screen
CPX #38
BEQ GETKEY
INX
BRA GETKEY
SCNDIS LDA #$A3
STA $E1C029
JSR WAIT
LDA #1
STA $E1C029
BRA GETKEY
ESC LDX #0
KEYDONE TXA
STA BUF
ZPG2 STA NAME
REP #$30
LONGA ON
RTS
WAIT LDA $E1C000
BPL WAIT
STA $E1C010
RTS
*
*
* Swap bank 0, execute, & swap back
*
*
DOPRO8 JSR SWAP ;Swap in Bank0 code
JSL BANK0 ;Execute
PHA
JSR SWAP ;Replace original data
PLA
RTS
SWAP LDX #END8-START8-2 ;length of Bank0 code
SWAP1 LDA START8,X
PHA
DC I1'$BF,0,8,0' ;=LDA BANK0,X
STA START8,X
PLA
DC I1'$9F,0,8,0' ;=STA BANK0,X
DEX
DEX
BPL SWAP1
RTS
*
*
* Title screen data
*
*
TITLE DC I2'$00B'
ASC 'Nibble Screen Saver '
DC I2'0'
DC I2'$08E'
ASC 'Thomas Dorris '
DC I2'0'
DC I2'$380'
ASC 'Enter name to save screen as: '
DC I2'0'
DC I2'$028'
ASC 'Include prefix and subdirectory '
DC I2'0'
DC I2'$128'
ASC '....................................... '
DC I2'0'
DC I2'$3A8'
ASC 'Press [SPACE] to view screen'
DC I2'0'
DC I2'$0D0'
ASC 'Press [ESC] to abort to accessories '
DC I2'0'
DC I2'0'
*
*
* Error message data
*
*
ERRMSG DC I2'$12D'
ASC 'Error code $ has occurred!'
DC I2'0'
DC I2'$2AD'
ASC 'Press any key to abort'
DC I2'0'
DC I2'0'
*
*
* ProDOS information
*
*
BUF DS 40 ;File name
HNDL DC I4'START8'
OPENPARM DS 2 ;Room for reference #
DC I4'BUF' ;Filename pointer
DC I4'HNDL' ;IO buffer handle
CREATEPARM DC I4'BUF' ;Filename
DC I2'$C3' ;Access type
DC I2'$C1' ;File type
DC I4'0' ;Aux type
DC I2'1' ;Storage type
DC I4'0' ;Date stuff
WRITEPARM DS 2 ;number location
DC I4'SCREEN' ;super hires screen
DC I4'32768' ;Length of screen data
DC I4'0' ;Room for amount written
START8 ANOP
*
*
* ProDOS 8 equates
*
*
MLI EQU $BF00 ;ProDOS 8 MLI call
BITMAP EQU $BF58 ;areas available for ProDOS
MLIACT EQU $BF9B ;Bit 7 tells if active
ZPAGE EQU $FA ;Used as pointer
CCREATE EQU $C0
CDESTROY EQU $C1
COPEN EQU $C8
CWRITE EQU $CB
CCLOSE EQU $CC
*
*
* ProDOS 8 main routine
*
*
OBJ $800
STRT8 ANOP
OPNBUF DS 1024
PHD ;Save direct page
PEA $0000
PLD
PHB
PHK
PLB
LDA ZPAGE ;Save zero page usage
PHA
LDA ZPAGE+2
PHA
LDA #SCREEN ;Set up pointer to screen
STA ZPAGE
LDA #^SCREEN
STA ZPAGE+2
LONGA OFF
LONGI OFF
SEC
XCE
SEP #$20
LDA BITMAP+1
STA MAPBYTE
STZ BITMAP+1
JSR MLI ;Destroy file
DC I1'CDESTROY'
DC I2'DESTPARM8'
BEQ DESTOK
CMP #$46 ;FILE NOT FOUND
BNE EXIT
DESTOK JSR MLI ;Create file
DC I1'CCREATE'
DC I2'CREATEPARM8'
BNE EXIT
JSR MLI ;Open file
DC I1'COPEN'
DC I2'OPENPARM8'
BNE EXIT
LDA OPENREF
STA WRITEREF
STA CLSREF
MOVEMORE LDY #0
MOVE LDA [ZPAGE],Y
STA WRTBUF,Y
NOINC INY
BNE MOVE
INC ZPAGE+1
JSR MLI ;Write next segment
DC I1'CWRITE'
DC I2'WRITEPARM8'
BNE EXIT
LDA ZPAGE+1
CMP #$A0
BNE MOVEMORE
LDA #0 ;Load Acc with no error
EXIT STA ERROR8
JSR MLI
DC I1'CCLOSE'
DC I2'CLOSEPARM8'
LDA MAPBYTE ;Restore original bitmap
STA BITMAP+1
LONGA ON
LONGI ON
CLC
XCE
REP #$30
PLA
STA ZPAGE+2
PLA
STA ZPAGE
LDA ERROR8
AND #$00FF
PLB
PLD
RTL
*
*
* ProDOS 8 parms
*
*
WRTBUF DS 256
ERROR8 DS 1
MAPBYTE DS 1
NAME DS 40
DESTPARM8 DC I1'1'
DC I2'NAME'
CREATEPARM8 DC I1'7'
DC I2'NAME'
DC I1'$C3'
DC I1'$C1'
DC I2'0'
DC I1'1'
DC I2'0'
DC I2'0'
OPENPARM8 DC I1'3'
DC I2'NAME'
DC I2'OPNBUF'
OPENREF DC I1'1'
WRITEPARM8 DC I1'4'
WRITEREF DC I1'1'
DC I2'WRTBUF'
DC I2'256'
DC I2'0'
CLOSEPARM8 DC I1'1'
CLSREF DC I1'1'
OBJEND
END8 ANOP
END